<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 复杂数据类型的简单赋值会造成引用问题  用深拷贝解决
      //1、递归深拷贝(通用)  2、JSON.stringify  JSON.parse
      //一、递归深拷贝
      //1.拷贝一层
      //   var obj = {
      //     name: '张三',
      //     age: 20,
      //   }
      //   function deepCopy(obj) {
      //     // 根据对象类型 开辟堆空间 变量以接收深拷贝内容
      //     var myobj = Object.prototype.toString.call(obj) === '[object Array]' ? [] : {}
      //     // 遍历对象 对myobj 赋值
      //     for (let key in obj) {
      //       myobj[key] = obj[key]
      //     }
      //     //返回这个对象
      //     return myobj
      //   }
      //  var  obj_new = deepCopy(obj)
      //  var arr = [2,3,4,5]
      //  var arr_new = deepCopy(arr)
      //   arr.splice(2,2)
      //  obj.name = '李四'
      //  console.log(obj_new);
      //  console.log(arr_new);
      //既能拷贝对象又能拷贝数组
      //2、拷贝多层
    //   var obj = {
    //     myname: '张三',
    //     age: 20,
    //     hobby: {
    //       one: '篮球',
    //       two: '足球',
    //     },
    //   }
    //   function deepCopy(obj) {
    //     // 根据对象类型 开辟堆空间 变量以接收深拷贝内容
    //     var myobj =
    //       Object.prototype.toString.call(obj) === '[object Array]' ? [] : {}
    //     // 遍历对象 对myobj 赋值
    //     for (let key in obj) {
    //       myobj[key] = obj[key]
    //     }
    //     //返回这个对象
    //     return myobj
    //   }
    //   var new_obj = deepCopy(obj)
      // obj.myname ='王五'
      // console.log(new_obj);
      function deeepCopy(obj) {
        //根据obj类型开辟内存空间
        let my_new_obj =Object.prototype.toString.call(obj) === '[object Array]' ? [] : {}

        //循环对象作一层拷贝
        for (let key in obj) {
          //如果是对象类型就继续调用深拷贝
          if (typeof obj[key] === 'object') {
            //将深拷贝的内容赋值给返回的对象
            my_new_obj[key]= deeepCopy(obj[key])
          }else{
            // 未深拷贝直接赋值
            my_new_obj[key] = obj[key]
          }
        }
        //返回这个对象
        return my_new_obj
      }
      var obj = {
        myname: '张三',
        age: 20,
        hobby: {
          one: '篮球',
          two: '足球',
        }
      }
      var new_obj = deeepCopy(obj)
      obj.hobby.two='保龄球'
      console.log(new_obj);
    </script>
  </body>
</html>
